/**
 * File : functions.js
 * Description : Fonctions JavaScript de Phenix
 * Date : 07.08.2012 12:26:50
 * 
 * This file is part of Phenix.  Phenix is free software: you can
 * redistribute it and/or modify it under the terms of the GNU General Public
 * License as published by the Free Software Foundation, version 2.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
 * details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 51
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Nils Schaetti <n.schaetti@gmail.com>
**/

/**
 * Coordonée X
 */
var mouseX = 0;

/**
 * Coordonée Y
 */
var mouseY = 0;

/**
 * Capture les mouvements de la souris à chaque mouvement de celle ci
 */
document.onmousemove = phenixGetMouseCoordinate;

/**
 * Nom de la list_view qui affiche les fichiers
 */
var homeListView = null;

/**
 * Répertoire actuellement listé
 */
var homeCurrentDirectory = '.';

/**
 * Répertoire précédemment listé
 */
var homeLastDirectory = '.';

/**
 * Est-ce qu'on affiche les fichiers cachés?
 */
var homeShowHiddenFiles = 0;

/**
 * Les arguments courant pour la command ls
 * 0 = filename
 * 1 = owner
 * 2 = modification time
 */
var homeCurrentOrder = 0;

/**
 * Adresse du serveur
 */
var phenixAddress = 'http://localhost/Phenix/';

/**
 * Stock les coordonnées de la souris
 */
function phenixGetMouseCoordinate(event)
{
	ev = event || window.event;
	mouseX = ev.pageX;
	mouseY = ev.pageY;
}

/**
 * Cette fonction affiche la boîte de dialogue de création d'un nouveau répertoire
 * 
 * @param string code Code HTML de la page intérieure
 */
function phenixNewDirectoryDialog(event)
{
	// Contenu
	var contentDiv = document.createElement('div');
	
	// Ajoute du texte
	contentDiv.innerHTML += 'Name : <input type="text" class="ktkInputText" id="newDirectoryEntry" />';
	
	// Affiche la boîte de dialogue
	ktkShowDialogBox('New Directory', 'Create', 'Cancel', event.clientX, event.clientY, contentDiv, 'phenixNewDirectoryOk();', '');
}

/**
 * Cette fonction est appelée lors que l'utilisateur à répondu ok à la création d'un nouveau répertoire
 */
function phenixNewDirectoryOk()
{
	// La zone de texte
	// La zone de texte
	var nameEntry = document.getElementById('newDirectoryEntry');
	
	// Si la zone n'est pas vide
	if(nameEntry.value != '')
	{
		// Crée un répertoire
		phenixCreateNewDirectory(homeCurrentDirectory + '/' + nameEntry.value);
		
		// Réaffiche le répertoire
		phenixListDirectory('phenixListView',homeCurrentDirectory);
		
		// Ferme la boîte de dialogue
		ktkCloseDialogBox();
	}
}

/**
 * Affiche une boîte de dialogue d'erreur
 * 
 * @param string message Message à afficher
 */
function phenixShowErrorDialog(messages)
{
	// Contenu
	var contentDiv = document.createElement('div');
		
	// Ajoute du texte
	contentDiv.innerHTML += messages;
	
	// Padding
	contentDiv.setAttribute('style','padding: 4px');

	// Affiche la boîte de dialogue
	ktkShowDialogBox('Error', '', 'Ok', mouseX, mouseY, contentDiv, '', 'phenixAfterErrorDialog();');
}

/**
 * Retourne au répertoire précédent
 */
function phenixAfterErrorDialog()
{
	// Liste le répertoire précédent
	phenixListDirectory('phenixListView',homeLastDirectory, homeCurrentOrder);
}

/**
 * Cette fonction affiche le boîte de dialogue de changement de droits
 */
function phenixChmodDialog(file)
{
	// Objet Ajax
	var xhr = null;
	
	// Selon type
	if(window.XMLHttpRequest)
		xhr = new XMLHttpRequest();
	else if(window.ActiveXObject)
		xhr = new ActiveXObject("Microsoft.XMLHTTP");
	
	// On définit l'appel de la fonction au retour serveur
	xhr.onreadystatechange = function() { phenixChmodDialogCallback(xhr); };
	alert(phenixAddress + "/getperm.php?file=" + file);
	// On appelle le fichier list_dir.php
	xhr.open("GET", phenixAddress + "/getperm.php?file=" + file, true);
	xhr.send(null);
}

/**
 * Fonction callback de phenixChmodDialog
 *
 * @param object Objet Ajax
 */
function phenixChmodDialogCallback(xhr)
{
	// Récupère le réponse XML
	var docXML = xhr.responseXML;

	// Erreurs éventuelles
	var error = docXML.getElementsByTagName("error");
	if(error.length > 0)
	{
		phenixShowErrorDialog(error.item(0).firstChild.data);
		return;
	}
	
	// Contenu XML
	var user = docXML.getElementsByTagName("user");
	var group = docXML.getElementsByTagName("group");
	var others = docXML.getElementsByTagName("others");
	
	// Droits
	var userPerm = user.item(0).firstChild.data;
	var groupPerm = group.item(0).firstChild.data;
	var othersPerm = others.item(0).firstChild.data;
	
	// Contenu
	var contentDiv = document.createElement('div');
	
	// Création d'un tableau
	var table = document.createElement('table');
	table.setAttribute('border','0');
	
	// Ligne titre
	var titreTr = document.createElement('tr');
	
	// Cellule vide
	var emptyTitleTd = document.createElement('td');
	emptyTitleTd.innerHTML = '';
	titreTr.appendChild(emptyTitleTd);
	
	// Cellule 'Read'
	var readTitleTd = document.createElement('td');
	readTitleTd.innerHTML = 'Read';
	titreTr.appendChild(readTitleTd);
	
	// Cellule 'Write'
	var writeTitleTd = document.createElement('td');
	writeTitleTd.innerHTML = 'Write';
	titreTr.appendChild(writeTitleTd);
	
	// Cellule 'Exec'
	var execTitleTd = document.createElement('td');
	execTitleTd.innerHTML = 'Exec';
	titreTr.appendChild(execTitleTd);
	
	// Ligne Owner
	var ownerTr = document.createElement('tr');
	
	// Cellule 'Owner'
	var ownerEmptyTd = document.createElement('td');
	ownerEmptyTd.innerHTML = '<b>Owner</b>';
	ownerTr.appendChild(ownerEmptyTd);
	
	//  Cellule Owner/Read
	var readOwnerTd = document.createElement('td');
	if(userPerm[0] == '-')
		readOwnerTd.innerHTML = '<input type="checkbox" />';
	else
		readOwnerTd.innerHTML = '<input type="checkbox" checked="true" />';
	ownerTr.appendChild(readOwnerTd);
	
	// Cellule Owner/Write
	var writeOwnerTd = document.createElement('td');
	writeOwnerTd.innerHTML = '<input type="checkbox" />';
	ownerTr.appendChild(writeOwnerTd);
	
	// Cellule Owner/Execute
	var execOwnerTd = document.createElement('td');
	execOwnerTd.innerHTML = '<input type="checkbox" />';
	ownerTr.appendChild(execOwnerTd);
	
	// Ligne Group
	var groupTr = document.createElement('tr');
	
	// Cellule 'Owner'
	var groupEmptyTd = document.createElement('td');
	groupEmptyTd.innerHTML = '<b>Group</b>';
	groupTr.appendChild(groupEmptyTd);
	
	//  Cellule Owner/Read
	var readGroupTd = document.createElement('td');
	readGroupTd.innerHTML = '<input type="checkbox" />';
	groupTr.appendChild(readGroupTd);
	
	// Cellule Owner/Write
	var writeGroupTd = document.createElement('td');
	writeGroupTd.innerHTML = '<input type="checkbox" />';
	groupTr.appendChild(writeGroupTd);
	
	// Cellule Owner/Execute
	var execGroupTd = document.createElement('td');
	execGroupTd.innerHTML = '<input type="checkbox" />';
	groupTr.appendChild(execGroupTd);
	
	// Ligne Others
	var othersTr = document.createElement('tr');
	
	// Cellule 'Owner'
	var othersEmptyTd = document.createElement('td');
	othersEmptyTd.innerHTML = '<b>Others</b>';
	othersTr.appendChild(othersEmptyTd);
	
	//  Cellule Owner/Read
	var readOthersTd = document.createElement('td');
	readOthersTd.innerHTML = '<input type="checkbox" />';
	othersTr.appendChild(readOthersTd);
	
	// Cellule Owner/Write
	var writeOthersTd = document.createElement('td');
	writeOthersTd.innerHTML = '<input type="checkbox" />';
	othersTr.appendChild(writeOthersTd);
	
	// Cellule Owner/Execute
	var execOthersTd = document.createElement('td');
	execOthersTd.innerHTML = '<input type="checkbox" />';
	othersTr.appendChild(execOthersTd);
	
	// Ajoute les lignes
	table.appendChild(titreTr);
	table.appendChild(ownerTr);
	table.appendChild(groupTr);
	table.appendChild(othersTr);
	
	// Ajoute le tableau
	contentDiv.appendChild(table);
	
	// Affiche la boîte de dialogue
	ktkShowDialogBox('Change right', 'Change', 'Cancel', mouseX, mouseY, contentDiv, '', '');
}

/**
 * Affiche le répertoire supérieur
 * 
 * @param string list_view_dir Nom de la listview
 */
function phenixUpDirectory(list_view_id)
{
	// Liste le répertoire
	phenixListDirectory(list_view_id, homeCurrentDirectory + '/..');
}

/**
 * Affiche un répertoire
 * 
 * @param string list_view_id Nom de la listview
 * @param string dir Directory to list
 */
function phenixListDirectory(list_view_id, dir, order)
{
	// List_view à traiter
	homeListView = list_view_id;
	
	// Chemin courant
	homeLastDirectory = homeCurrentDirectory;
	homeCurrentDirectory = dir;
	
	// Objet Ajax
	var xhr = null;
	
	// Selon type
	if(window.XMLHttpRequest)
		xhr = new XMLHttpRequest();
	else if(window.ActiveXObject)
		xhr = new ActiveXObject("Microsoft.XMLHTTP");
	
	// On définit l'appel de la fonction au retour serveur
	xhr.onreadystatechange = function() { phenixListDirectoryCallback(xhr); };
	
	// On appelle le fichier list_dir.php
	xhr.open("GET", phenixAddress + "/list_dir.php?order=" + homeCurrentOrder + "&showHiddenFiles=" + homeShowHiddenFiles + "&dir=" + dir, true);
	xhr.send(null);
}

/**
 * Fonction de rappelle Ajax de phenixListDirectory
 *
 * @param object xhr Objet Ajax
 */
function phenixListDirectoryCallback(xhr)
{
	// Récupère le réponse XML
	var docXML = xhr.responseXML;
	
	// Erreurs éventuelles
	var error = docXML.getElementsByTagName("error");
	if(error.length > 0)
	{
		phenixShowErrorDialog(error.item(0).firstChild.data);
		return;
	}
	
	// Les tags
	var types = docXML.getElementsByTagName("type");
	var names = docXML.getElementsByTagName("name");
	var permissions = docXML.getElementsByTagName("permissions");
	var owners = docXML.getElementsByTagName("owner");
	var sizes = docXML.getElementsByTagName('size');
	var last = docXML.getElementsByTagName("last");
	
	// Vide la liste
	ktkEmptyListView(homeListView);
	
	// Boucle sur tous les éléments
	for (i=0;i<types.length;i++)
	{
		// Checkbox
		var checkboxObj = new Object();
		checkboxObj["type"] = "small";
		checkboxObj["html"] = '<input type="checkbox" value="">';
		checkboxObj["link"] = "javascript:phenixLineChecked('phenixListView'," + i + ");";
		checkboxObj["column"] = 'CheckboxColumn';
		
		// Image
		var imageObj = new Object();
		imageObj["type"] = "small";
		if(types.item(i).firstChild.data == 'dir')
			imageObj["html"] = '<img src="' + phenixAddress + '/images/file_types/folder.png"/>';
		else
			imageObj["html"] = '<img src="' + phenixAddress + '/images/file_types/unknown.png"/>';
		imageObj["link"] = '';
		imageObj["column"] = 'TypeColumn';
		
		// Filename
		var filenameObj = new Object();
		filenameObj["type"] = "normal";
		filenameObj["html"] = names.item(i).firstChild.data;
		if(types.item(i).firstChild.data == 'dir')
			filenameObj["link"] = "javascript: phenixListDirectory('phenixListView','" + homeCurrentDirectory + '/' + filenameObj["html"] + "');";
		else
			filenameObj["link"] = "";
		filenameObj["column"] = 'FilenameColumn';
		
		// Permissions
		var permissionsObj = new Object();
		permissionsObj["type"] = "normal";
		permissionsObj["html"] = permissions.item(i).firstChild.data;
		permissionsObj["link"] = 'javascript: phenixChmodDialog(\'' + homeCurrentDirectory + '/' + filenameObj["html"] + '\');';
		permissionsObj["column"] = 'AccessRightColumn';
		
		// Owner
		var ownerObj = new Object();
		ownerObj["type"] = "normal";
		ownerObj["html"] = owners.item(i).firstChild.data;
		ownerObj["link"] = '';
		ownerObj["column"] = 'OwnerColumn';
		
		// Size
		var sizeObj = new Object();
		sizeObj["type"] = "normal";
		sizeObj["html"] = sizes.item(i).firstChild.data + ' bytes';
		sizeObj["link"] = '';
		sizeObj["column"] = 'SizeColumn';
		
		// Last modification
		var lastObj = new Object();
		lastObj["type"] = "normal";
		lastObj["html"] = last.item(i).firstChild.data;
		lastObj["link"] = '';
		lastObj["column"] = 'LastModificationColumn';
		
		// Rename
		var renameObj = new Object();
		renameObj["type"] = "normal";
		renameObj["html"] = '<img src="' + phenixAddress + '/images/rename.png"/>';
		renameObj["link"] = '';
		renameObj["column"] = 'RenameColumn';
		
		// Image
		var downloadObj = new Object();
		downloadObj["type"] = "normal";
		if(types.item(i).firstChild.data == 'file')
			downloadObj["html"] = '<img src="' + phenixAddress + '/images/download.png"/>';
		else
			downloadObj["html"] = '';
		downloadObj["link"] = '';
		downloadObj["column"] = 'DownloadColumn';
		
		// Ajoute la ligne
		ktkAppendLine('phenixListView',i,checkboxObj,imageObj,filenameObj,permissionsObj,ownerObj,sizeObj,lastObj,renameObj,downloadObj);
	}
}

/**
 * Appelé lorsqu'une ligne est checkée
 * 
 * @param integer n_line Numéro de la ligne
 */
function phenixLineChecked(list_view_id, n_line)
{
	// Est-ce que la ligne est en surbrillance?
	if(!ktkIsHighligh(list_view_id, n_line))
	{
		// Met la ligne en surbrillance
		ktkHighlighLine(list_view_id, n_line);
		
		// Affiche le bouton "Supprimer"
		ktkMiniToolbarShowButton('phenixMiniToolbar','mtDelete');
	}
	else
	{
		// Rend la ligne normale
		ktkUnhighlighLine(list_view_id, n_line);
		
		// Lignes sélectionnées
		var selectedLines = ktkListViewGetSelectedLines('phenixListView');
		
		// Il y a encore une ligne sélectionnée
		if(selectedLines.length == 0)
		{
			// Cache le bouton "Supprimer"
			ktkMiniToolbarHideButton('phenixMiniToolbar','mtDelete');
		}
	}
}

/**
 * Affiche/cache les fichiers cachés du répertoire
 */
function phenixShowHiddenFiles()
{
	// Si le bouton est deja sélectionné ou non
	if(!ktkMiniToolbarIsButtonSelected('phenixMiniToolbar','mtShowHidden'))
	{
		// Sélectionne le bouton
		ktkMiniToolbarSelectButton('phenixMiniToolbar','mtShowHidden');
		
		// On affiche les fichiers cachés
		homeShowHiddenFiles = 1;

		// Réaffiche les fichiers
		phenixListDirectory('phenixListView',homeCurrentDirectory, homeCurrentOrder);
	}
	else
	{
		// Désélectionne le bouton
		ktkMiniToolbarUnselectButton('phenixMiniToolbar','mtShowHidden');
		
		// On affiche les fichiers cachés
		homeShowHiddenFiles = 0;

		// Réaffiche les fichiers
		phenixListDirectory('phenixListView',homeCurrentDirectory, homeCurrentOrder);
	}
}

/**
 * Cette fonction crée un nouveau répertoire
 * 
 * @param string dir Chemin du nouveau répertoire
 */
function phenixCreateNewDirectory(dir)
{
	// Objet Ajax
	var xhr = null;
	
	// Selon type
	if(window.XMLHttpRequest)
		xhr = new XMLHttpRequest();
	else if(window.ActiveXObject)
		xhr = new ActiveXObject("Microsoft.XMLHTTP");
	
	// On définit l'appel de la fonction au retour serveur
	xhr.onreadystatechange = function() { phenixCreateNewDirectoryCallback(xhr); };
	
	// On appelle le fichier list_dir.php
	xhr.open("GET", phenixAddress + "/mkdir.php?dir=" + dir, true);
	xhr.send(null);
}

/**
 * Fonction de rappelle Ajax de phenixCreateNewDirectory
 *
 * @param object xhr Objet Ajax
 */
function phenixCreateNewDirectoryCallback(xhr)
{
	// Récupère le réponse XML
	var docXML = xhr.responseXML;
	
	// Erreurs éventuelles
	var error = docXML.getElementsByTagName("error");
	if(error.length > 0)
		phenixShowErrorDialog(error.item(0).firstChild.data);
}

/**
 * Tri la liste des fichiers par date de dernière modification
 * 
 * @param string mini_toolbar Nom de la barre
 */
function phenixOrderByTime(mini_toolbar)
{
	// Si le bouton n'est pas deja sélectionné
	if(!ktkMiniToolbarIsButtonSelected(mini_toolbar, 'mtOrderTime'))
	{
		// Désactive les autres boutons
		ktkMiniToolbarUnselectButton(mini_toolbar, 'mtOrderSize');
		ktkMiniToolbarUnselectButton(mini_toolbar, 'mtOrderFilename');
		
		// Active
		ktkMiniToolbarSelectButton(mini_toolbar, 'mtOrderTime');
		
		// Change l'order
		homeCurrentOrder = 2;
		
		// Reaffiche le répertoire
		phenixListDirectory('phenixListView',homeCurrentDirectory, homeCurrentOrder);
	}
}

/**
 * Tri la liste des fichiers par taille de fichier
 * 
 * @param string mini_toolbar Nom de la barre
 */
function phenixOrderBySize(mini_toolbar)
{
	// Si le bouton n'est pas deja sélectionné
	if(!ktkMiniToolbarIsButtonSelected(mini_toolbar, 'mtOrderSize'))
	{
		// Désactive les autres boutons
		ktkMiniToolbarUnselectButton(mini_toolbar, 'mtOrderTime');
		ktkMiniToolbarUnselectButton(mini_toolbar, 'mtOrderFilename');
		
		// Active
		ktkMiniToolbarSelectButton(mini_toolbar, 'mtOrderSize');
		
		// Change l'order
		homeCurrentOrder = 1;
		
		// Reaffiche le répertoire
		phenixListDirectory('phenixListView',homeCurrentDirectory, homeCurrentOrder);
	}
}

/**
 * Tri la liste des fichiers par nom de fichier
 * 
 * @param string mini_toolbar Nom de la barre
 */
function phenixOrderByFilename(mini_toolbar)
{
	// Si le bouton n'est pas deja sélectionné
	if(!ktkMiniToolbarIsButtonSelected(mini_toolbar, 'mtOrderFilename'))
	{
		// Désactive les autres boutons
		ktkMiniToolbarUnselectButton(mini_toolbar, 'mtOrderSize');
		ktkMiniToolbarUnselectButton(mini_toolbar, 'mtOrderTime');
		
		// Active
		ktkMiniToolbarSelectButton(mini_toolbar, 'mtOrderFilename');
		
		// Change l'order
		homeCurrentOrder = 0;
		
		// Reaffiche le répertoire
		phenixListDirectory('phenixListView',homeCurrentDirectory, homeCurrentOrder);
	}
}

/**
 * Appelée lorsque le bouton "Supprimer est clické
 * 
 * @param string list_view_id Nom de la liste
 */
function phenixDeleteButton(list_view_id)
{
	// Boîte de dialogue
	phenixDeleteFileDialog();
}

/**
 * Affiche une boîte de dialogue de confirmation avant suppression de fichiers
 */
function phenixDeleteFileDialog()
{
	// Contenu
	var contentDiv = document.createElement('div');
	
	// Text
	contentDiv.appendChild(document.createTextNode('Are you sure you want to delete this/these file(s)'));
	contentDiv.setAttribute('style', 'padding: 4px');
	
	// Boîte de dialogue
	ktkShowDialogBox('Delete file(s)', 'Yes', 'No', mouseX, mouseY, contentDiv, 'phenixDeleteFile();', '');
}

/**
 * Supprime les fichiers sélectionnés
 */
function phenixDeleteFile()
{
	// Lignes sélectionnées
	var lines = ktkListViewGetSelectedLines('phenixListView');
	
	// Pour chaque lignes sélectionnées
	for(var i = 0; i < lines.length; i++)
	{
		// Objet Ajax
		var xhr = null;
		
		// Selon type
		if(window.XMLHttpRequest)
			xhr = new XMLHttpRequest();
		else if(window.ActiveXObject)
			xhr = new ActiveXObject("Microsoft.XMLHTTP");
		
		// Fichier
		var filename = homeCurrentDirectory + '/' + lines[i].childNodes[2].childNodes[0].innerHTML;
	
		// On définit l'appel de la fonction au retour serveur
		xhr.onreadystatechange = function() { phenixDeleteFileCallback(xhr); };
	
		// On appelle le fichier list_dir.php
		xhr.open("GET", phenixAddress + "/rm.php?file=" + filename, true);
		xhr.send(null);
	}
	
	// Ferme la boîte de dialogue
	ktkDialogBoxCancel();
	
	// Cache le bouton "Supprimer"
	ktkMiniToolbarHideButton('phenixMiniToolbar','mtDelete');
}

/**
 * Fonction callback de phenixDeleteFile
 */
function phenixDeleteFileCallback(xhr)
{
	// Récupère le réponse XML
	var docXML = xhr.responseXML;
	
	// Erreurs éventuelles
	var error = docXML.getElementsByTagName("error");
	if(error.length > 0)
	{
		phenixShowErrorDialog(error.item(0).firstChild.data);
		return;
	}
	
	// Réaffiche les fichiers
	phenixListDirectory('phenixListView',homeCurrentDirectory, homeCurrentOrder);
}

/**
 * Déplace des fichiers
 * 
 * @param string source Fichier à déplacer
 * @param string destination Fichier destination
 */
function phenixMoveFile(source, destination)
{
	// Objet Ajax
	var xhr = null;
	
	// Selon type
	if(window.XMLHttpRequest)
		xhr = new XMLHttpRequest();
	else if(window.ActiveXObject)
		xhr = new ActiveXObject("Microsoft.XMLHTTP");
		
	// On définit l'appel de la fonction au retour serveur
	xhr.onreadystatechange = function() { phenixMoveFileCallback(xhr); };
	
	// On appelle le fichier list_dir.php
	xhr.open("GET", phenixAddress + "/move.php?source=" + source + "&destination=" + destination, true);
	xhr.send(null);
	
	// Ferme le boîte de dialogue
	ktkCloseDialogBox();
}

/**
 * Fonction callback de phenixMoveFile
 * 
 * @param object xhr Objet ajax
 */
function phenuxMoveFileCallback(xhr)
{
	// Récupère le réponse XML
	var docXML = xhr.responseXML;
	
	// Erreurs éventuelles
	var error = docXML.getElementsByTagName("error");
	if(error.length > 0)
	{
		phenixShowErrorDialog(error.item(0).firstChild.data);
		return;
	}
	
	// Réaffiche les fichiers
	phenixListDirectory('phenixListView',homeCurrentDirectory, homeCurrentOrder);
}


